#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct student {
	char id[20];
	char name[20];
	char sex[3];
	double chinese;
	double english;
	double math;
};
//欢迎函数
void welcome(){
	    printf("\t\t欢迎进入系统\t\t\n");
		printf("\t\t-----------------------\t\t\n");
		printf("\t\t1.增加学生信息\t\t\n");
		printf("\t\t2.删除学生信息\t\t\n");
		printf("\t\t3.修改学生信息\t\t\n");
		printf("\t\t4.打印所有学生信息\t\t\n");
		printf("\t\t5.查询某学生各科成绩\t\t\n");
		printf("\t\t6.统计不及格科目超过两科\t\t\n");
		printf("\t\t7.班级内单科成绩排名\t\t\n");
		printf("\t\t0.退出系统\t\t\n");
		printf("\t\t------------------------\t\t\n");
		printf("\t\t请选择业务\t\t\n");
}
//增加
int addstudent (struct student s[],int n)
{
    printf("请输入学生ID：\n");
    scanf("%s", s[n].id); 
    // 检查ID是否唯一
    for (int i = 0; i < n; i++) {
        if (strcmp(s[i].id, s[n].id) == 0) { // 判断是否有重复id
            printf("此ID已存在，请输入不同的ID。\n");
            return n; // 返回当前学生数量，不增加新学生
        }
    }
    printf("请输入学生姓名：\n");
    scanf("%s", s[n].name);
    printf("请输入学生性别：\n");
    scanf("%s", s[n].sex);
    printf("请输入学生语文成绩：\n");
    scanf("%lf",&s[n].chinese);
    printf("请输入学生英语成绩：\n");
    scanf("%lf",&s[n].english);
    printf("请输入学生数学成绩：\n");
    scanf("%lf",&s[n].math);
    printf("您已成功添加！\n");
    return n + 1; // 增加学生数量并返回
}

//删除
int delstudent (struct student s[],int n)
{
    char found;
    char id[20];//新id和原来的id比对
    printf("请输入要删除的学生ID：\n");
    scanf("%s", id);
    for (int i = 0; i < n; i++) {
        if (strcmp(s[i].id, id) == 0) {//比较是否相同
            for (int j = i; j < n - 1; j++) {
                s[j] = s[j + 1]; // 将后面的学生信息前移，覆盖前面学生信息
            }
            printf("是否选择删除？'1':是 '0':否\n");
            while (getchar() != '\n');
            scanf("%c",&found);
            if (found=='1'){
            printf("删除成功！\n");
            return n - 1; // 减少学生数量
			}
			else if(found=='0'){
			printf("已退出系统！\n");
	        return n;
			}
			else{
				printf("输入有误，已退出！\n");
				return n;
			}
        }
    }
    printf("未找到该ID的学生。\n");
    return n;	
}
//修改
int changestudent(struct student s[],int n)
{ 
    char found;
    char select;
	char id[20];
    printf("请输入要修改的学生ID：\n");
    scanf("%s", id);
    for (int i = 0; i < n; i++) {
        if (strcmp(s[i].id, id) == 0) {
            printf("找到该学生\n");
            printf("id:%s\n",s[i].id);
            printf("姓名:%s\n",s[i].name);
            printf("性别:%s\n",s[i].sex);
            printf("语文成绩:%2lf\n",s[i].chinese);
            printf("英语成绩:%2lf\n",s[i].english);
            printf("数学成绩:%2lf\n",s[i].math);
           
            printf("请选择您要修改的学生信息：\n");
            printf("\t1.id号\t\n");
            printf("\t2.姓名\t\n");
            printf("\t3.性别\t\n");
            printf("\t4.语文成绩\t\n");
            printf("\t5.英语成绩\t\n");
            printf("\t6.数学成绩\t\n");
            printf("\t0.退出\t\n");
            scanf("%c",&select);
            switch(select){
            	case '1':
            		printf("请输入新的学生id：\n");
                    scanf("%s", s[i].id);
                    break;
                case '2':
                	printf("请输入新的学生姓名：\n");
                    scanf("%s", s[i].name);
                    break;
                case '3':
                	printf("请输入新的学生性别：\n");
                    scanf("%s", s[i].sex);
					break;
				case '4':
				 	printf("请输入新的学生语文成绩：\n");
                    scanf("%lf",&s[i].chinese);	
                    break;
                case '5':
                	 printf("请输入新的学生英语成绩：\n");
                     scanf("%lf",&s[i].english);
					 break;	
			    case '6':
			    	 printf("请输入新的学生数学成绩：\n");
                     scanf("%lf",&s[i].math);
                     break;
                case '0':
                	printf("程序已经退出！\n");
                	return n;
                default:
                	printf("选择有误，请重新输入！\n");
                	break;
			}  
			printf("是否确认修改？'1'：是 '0'：否\n");
			scanf("%c",&found) ;
			if(found=='1'){
				 printf("修改成功！\n");
            return n;
			}    
			else if(found=='0'){
				printf("已退出系统！\n");
				return n;
			}
           else{
           	printf("输入有误，请重新选择！\n");
           	return n;
		   }
        }
    }
    printf("未找到该ID的学生。\n");
    return n;
			}
			
//打印函数
void showstudent(struct student s[],int n)
{
	printf("学生信息如下：\n");
	int i;
	for (i=0;i<n;i++)
	{
		printf("ID:%s\n 名字：%s\n 性别：%s\n 语文成绩：%.2lf\n 英语成绩：%.2lf\n 数学成绩：%.2lf\n",s[i].id,s[i].name,s[i].sex,s[i].chinese,s[i].english,s[i].math);
	}
}
//查询学生成绩
int findscore(struct student s[],int n){
	char id[20];
    printf("请输入您要查询的学生id:\n");
	scanf("%s",id);
	for(int i=0;i<n;i++){
		if(strcmp(s[i].id,id)==0){
			printf("找到该学生!\n");
			printf("  id：%s\n  姓名：%s\n  语文成绩：%2lf\n  英语成绩：%2lf\n  数学成绩：%2lf\n",s[i].id,s[i].name,s[i].chinese,s[i].english,s[i].math);
}		   
           return n;
	}
	printf("未找到该id学生！\n");
	return n;
	}
//统计所有不及格科目超过两科的学生名单
void failscore(struct student s[],int n){	
	int i;
	int found =0;//标志变量，0表示未找到符合条件的学生
	for (i=0;i<n;i++){
		int temp=0;//用于统计不及格成绩的个数
		if(s[i].chinese<60){
			temp++;
		}
		if(s[i].english<60){
			temp++;
		}
		if(s[i].math<60){
			temp++;
		}
		if(temp>2){
			printf(" 学生的id：%s\n 姓名：%s\n",s[i].id,s[i].name);
			found=1;
		}
	}
	if (found==0){
		printf("没有学生不及格科目超过两门！\n");
	}
}
//班级内单科成绩排名
void rankstudent (struct student s[],int n){
	int i,j,temp;
	char select;
		printf("\t请选择你要排名的科目\t\n");
		printf("\t1.语文\t\n");
		printf("\t2.英语\t\n");
		printf("\t3.数学\t\n");
		printf("\t0.退出\t\n");
		scanf("%c",&select);	
	switch(select){
		case '1':
			for(i=0;i<n-1;i++){
		for(j=0;j<(n-1)-i;j++){
			if(s[j].chinese<s[j+1].chinese){
				char str[20];//用于交换字符串数值
				char tpy[20];
				temp=s[j].chinese;
				s[j].chinese=s[j+1].chinese;
				s[j+1].chinese=temp;
				strcpy(str,s[j+1].name);
				strcpy(s[j+1].name,s[j].name);
				strcpy(s[j].name,str);
				strcpy(tpy,s[j+1].id);
				strcpy(s[j+1].id,s[j].id);
				strcpy(s[j].id,tpy);
			}
		}
}
	printf("按照从高到低成绩排序：\n");
	for (i=0;i<n;i++){
		printf("  %s",s[i].id);
		printf("  %s",s[i].name);
		printf("  %lf\n",s[i].chinese);
	}	
		break;	
    case '2':
    	for(i=0;i<n-1;i++){
		for(j=0;j<(n-1)-i;j++){
			if(s[j].english<s[j+1].english){
				char str[20];//用于交换字符串数值
				char tpy[20];
				temp=s[j].english;
				s[j].english=s[j+1].english;
				s[j+1].english=temp;
				strcpy(str,s[j+1].name);
				strcpy(s[j+1].name,s[j].name);
				strcpy(s[j].name,str);
				strcpy(tpy,s[j+1].id);
				strcpy(s[j+1].id,s[j].id);
				strcpy(s[j].id,tpy);
			}
		}
	}
	printf("按照从高到低成绩排序：\n");
	for (i=0;i<n;i++){
		printf("  %s",s[i].id);
		printf("  %s",s[i].name);
		printf("  %lf\n",s[i].english);
	}
	break;
    case '3':
   	for(i=0;i<n-1;i++){
		for(j=0;j<(n-1)-i;j++){
			if(s[j].math<s[j+1].math){
				char str[20];//用于交换字符串数值
				char tpy[20];
				temp=s[j].math;
				s[j].math=s[j+1].math;
				s[j+1].math=temp;
				strcpy(str,s[j+1].name);
				strcpy(s[j+1].name,s[j].name);
				strcpy(s[j].name,str);
				strcpy(tpy,s[j+1].id);
				strcpy(s[j+1].id,s[j].id);
				strcpy(s[j].id,tpy);
			}
		}
	}
	printf("按照从高到低成绩排序：\n");
	for (i=0;i<n;i++){
		printf("  %s",s[i].id);
		printf("  %s",s[i].name);
		printf("  %lf\n",s[i].math);
	}
   break;		
    case '0':
   	printf("程序已经退出！\n");
    break;
   default:
   	printf("无效选择，请重新输入！\n");		
	}
	while (getchar() != '\n');
    system("pause");
		}

int main(int argc, char *argv[]) {
	struct student s[1000];
	int numstudent =0;//学生数量初始化
	char select;//字符
	
	while(1){   
	    system("cls");
		welcome();
		scanf("%c",&select);
		switch (select)
		{
			case '1':
				if(numstudent<1000){
					numstudent=addstudent(s,numstudent);
				}
				else{
					printf("学生信息已满，无法增加\n");
				}
				break;
			case '2':
			   if(numstudent>=0){
			   	numstudent=delstudent(s,numstudent);
			   	}
				   else{
				   	printf("NULL!\n");
				   }
				break;
			case '3':
			 if(numstudent>0){
			 	numstudent=changestudent(s,numstudent);
			 	}
				 else {
				 	printf("NULL!\n");
				 }
			 
				break;
			case '4':
				if(numstudent>0){
					   showstudent(s,numstudent);
					}
					else{
						printf("NULL!\n");
					}
				
				break;
			case '5':
				if(numstudent>=0){
					findscore(s,numstudent);
				}
				else{
					printf("NULL!");
				}
				break;
			case '6':
				if(numstudent>0){
					failscore(s,numstudent);
				}
				else{
					printf("NULL!");
				}
				break;
			case '7':
				if(numstudent>0){
					rankstudent(s,numstudent);
				}
				else{
					printf("NULL!");
				}
				break;
			case '0':
				printf("程序已经退出！\n");
				return 0;
			default:
				printf("您的选择有误，请重新选择\n");
		
}
while (getchar() != '\n');
system("pause");
}
	return 0;
}